(define (make-thing name desc)
  (let ((current-place #f)
        (eatable #f))
    (define (self msg)
      (cond
        ((eq? msg 'name) (lambda (self) name))
        ((eq? msg 'description) (lambda (self) desc))
        ((eq? msg 'place) (lambda (self) current-place))
        ((eq? msg 'set-eatable)(lambda (self)(set! eatable #t)))
        ((eq? msg 'get-eatable)(lambda(self) eatable))
        ((eq? msg 'move-to!)
         (lambda(self new-place) 
           (begin (if(eq? current-place #f)
                                                               
                     null
                     (ask current-place 'delete-thing (ask self 'name))) 
                  (ask new-place 'add-thing! self)
                  (set! current-place new-place) )))))
    self))